Telegram Group & Telegram Channel
🧠 Байесовская очистка данных от дневного bias с помощью нелинейной регрессии

Снова измерения температуры 📈 — и снова проблема: каждый день датчик даёт случайное смещение (bias). Нам нужно не просто его найти, а сделать это более надёжно — с учётом неопределённости.

🔁 Уточнённые цели

1. Оценить дневной bias через байесовскую регрессию
2. Использовать нелинейный тренд вместо скользящего среднего
3. Построить интервалы доверия для оценённой температуры
4. Визуализировать, насколько хорошо работает очистка

📦 Шаг 1. Генерация данных (как раньше)


import pandas as pd
import numpy as np

np.random.seed(42)
days = pd.date_range("2023-01-01", periods=10, freq="D")
true_temp = np.sin(np.linspace(0, 3 * np.pi, 240)) * 10 + 20
bias_per_day = np.random.uniform(-2, 2, size=len(days))

df = pd.DataFrame({
"datetime": pd.date_range("2023-01-01", periods=240, freq="H"),
})
df["day"] = df["datetime"].dt.date
df["true_temp"] = true_temp
df["bias"] = df["day"].map(dict(zip(days.date, bias_per_day)))
df["measured_temp"] = df["true_temp"] + df["bias"] + np.random.normal(0, 0.5, size=240)

📐 Шаг 2. Построим нелинейную модель тренда (например, полиномиальную регрессию)


from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline

# Модель полиномиальной регрессии степени 6
X_time = np.arange(len(df)).reshape(-1, 1)
y = df["measured_temp"].values

model = make_pipeline(PolynomialFeatures(degree=6), Ridge(alpha=1.0))
model.fit(X_time, y)

df["trend_poly"] = model.predict(X_time)
df["residual"] = df["measured_temp"] - df["trend_poly"]


🧮 Шаг 3. Байесовская оценка bias (через среднее и стандартную ошибку)


bias_stats = df.groupby("day")["residual"].agg(["mean", "std", "count"])
bias_stats["stderr"] = bias_stats["std"] / np.sqrt(bias_stats["count"])
df["bias_bayes"] = df["day"].map(bias_stats["mean"])
df["bias_stderr"] = df["day"].map(bias_stats["stderr"])

# Восстановим очищенную температуру
df["restored_bayes"] = df["measured_temp"] - df["bias_bayes"]


📊 Шаг 4. Оценка качества и визуализация


from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(df["true_temp"], df["restored_bayes"], squared=False)
print(f"📉 RMSE (после байесовской очистки): {rmse:.3f}")


📈 Визуализация с доверительными интервалами


import matplotlib.pyplot as plt

for day in df["day"].unique():
day_data = df[df["day"] == day]
stderr = day_data["bias_stderr"].iloc[0]

plt.fill_between(day_data.index,
day_data["restored_bayes"] - stderr,
day_data["restored_bayes"] + stderr,
alpha=0.2, label=str(day) if day == df["day"].unique()[0] else "")

plt.plot(df["true_temp"], label="True Temp", lw=1.5)
plt.plot(df["restored_bayes"], label="Restored Temp (Bayes)", lw=1)
plt.legend()
plt.title("Восстановление температуры с доверительными интервалами")
plt.xlabel("Time")
plt.ylabel("°C")
plt.grid(True)
plt.show()

Вывод

✔️ Нелинейная регрессия даёт лучшее приближение тренда, чем скользящее среднее
✔️ Байесовская оценка даёт не только среднюю оценку bias, но и доверительные интервалы
✔️ Модель учитывает неопределённость и шум — ближе к реальной инженерной задаче
✔️ RMSE почти сравнивается с дисперсией шума → bias эффективно устраняется



tg-me.com/machinelearning_interview/1815
Create:
Last Update:

🧠 Байесовская очистка данных от дневного bias с помощью нелинейной регрессии

Снова измерения температуры 📈 — и снова проблема: каждый день датчик даёт случайное смещение (bias). Нам нужно не просто его найти, а сделать это более надёжно — с учётом неопределённости.

🔁 Уточнённые цели

1. Оценить дневной bias через байесовскую регрессию
2. Использовать нелинейный тренд вместо скользящего среднего
3. Построить интервалы доверия для оценённой температуры
4. Визуализировать, насколько хорошо работает очистка

📦 Шаг 1. Генерация данных (как раньше)


import pandas as pd
import numpy as np

np.random.seed(42)
days = pd.date_range("2023-01-01", periods=10, freq="D")
true_temp = np.sin(np.linspace(0, 3 * np.pi, 240)) * 10 + 20
bias_per_day = np.random.uniform(-2, 2, size=len(days))

df = pd.DataFrame({
"datetime": pd.date_range("2023-01-01", periods=240, freq="H"),
})
df["day"] = df["datetime"].dt.date
df["true_temp"] = true_temp
df["bias"] = df["day"].map(dict(zip(days.date, bias_per_day)))
df["measured_temp"] = df["true_temp"] + df["bias"] + np.random.normal(0, 0.5, size=240)

📐 Шаг 2. Построим нелинейную модель тренда (например, полиномиальную регрессию)


from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline

# Модель полиномиальной регрессии степени 6
X_time = np.arange(len(df)).reshape(-1, 1)
y = df["measured_temp"].values

model = make_pipeline(PolynomialFeatures(degree=6), Ridge(alpha=1.0))
model.fit(X_time, y)

df["trend_poly"] = model.predict(X_time)
df["residual"] = df["measured_temp"] - df["trend_poly"]


🧮 Шаг 3. Байесовская оценка bias (через среднее и стандартную ошибку)


bias_stats = df.groupby("day")["residual"].agg(["mean", "std", "count"])
bias_stats["stderr"] = bias_stats["std"] / np.sqrt(bias_stats["count"])
df["bias_bayes"] = df["day"].map(bias_stats["mean"])
df["bias_stderr"] = df["day"].map(bias_stats["stderr"])

# Восстановим очищенную температуру
df["restored_bayes"] = df["measured_temp"] - df["bias_bayes"]


📊 Шаг 4. Оценка качества и визуализация


from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(df["true_temp"], df["restored_bayes"], squared=False)
print(f"📉 RMSE (после байесовской очистки): {rmse:.3f}")


📈 Визуализация с доверительными интервалами


import matplotlib.pyplot as plt

for day in df["day"].unique():
day_data = df[df["day"] == day]
stderr = day_data["bias_stderr"].iloc[0]

plt.fill_between(day_data.index,
day_data["restored_bayes"] - stderr,
day_data["restored_bayes"] + stderr,
alpha=0.2, label=str(day) if day == df["day"].unique()[0] else "")

plt.plot(df["true_temp"], label="True Temp", lw=1.5)
plt.plot(df["restored_bayes"], label="Restored Temp (Bayes)", lw=1)
plt.legend()
plt.title("Восстановление температуры с доверительными интервалами")
plt.xlabel("Time")
plt.ylabel("°C")
plt.grid(True)
plt.show()

Вывод

✔️ Нелинейная регрессия даёт лучшее приближение тренда, чем скользящее среднее
✔️ Байесовская оценка даёт не только среднюю оценку bias, но и доверительные интервалы
✔️ Модель учитывает неопределённость и шум — ближе к реальной инженерной задаче
✔️ RMSE почти сравнивается с дисперсией шума → bias эффективно устраняется

BY Machine learning Interview


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/machinelearning_interview/1815

View MORE
Open in Telegram


Machine learning Interview Telegram | DID YOU KNOW?

Date: |

The Singapore stock market has alternated between positive and negative finishes through the last five trading days since the end of the two-day winning streak in which it had added more than a dozen points or 0.4 percent. The Straits Times Index now sits just above the 3,060-point plateau and it's likely to see a narrow trading range on Monday.

The lead from Wall Street offers little clarity as the major averages opened lower on Friday and then bounced back and forth across the unchanged line, finally finishing mixed and little changed.The Dow added 33.18 points or 0.10 percent to finish at 34,798.00, while the NASDAQ eased 4.54 points or 0.03 percent to close at 15,047.70 and the S&P 500 rose 6.50 points or 0.15 percent to end at 4,455.48. For the week, the Dow rose 0.6 percent, the NASDAQ added 0.1 percent and the S&P gained 0.5 percent.The lackluster performance on Wall Street came on uncertainty about the outlook for the markets following recent volatility.

Machine learning Interview from jp


Telegram Machine learning Interview
FROM USA